/**
 * 类、超类、子类
 */

public class Inheritance {
    static class Employee {
        String name;
        int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + getName() + '\'' +
                    ", age=" + getAge() +
                    '}';
        }

        public Employee(String n, int a) {
            name = n;
            age = a;
        }
    }


    static class Manager extends Employee {

        // super()， 是Employee的构造器的简写形式。
//        public Manager(String name, int age){
//            super(name, age);
//        }

        public Manager(String n, int a) {
            super(n, a);
//            name = n;
//            age = a;
        }

        // 重写就是， 父和子都有的方法， 方法名一样，参数也一样。
        // 如果参数类型和参数的数量是一致的就是冲载。
        // 其实如果方法一样， 那么直接使用继承过来的方法就可以了， 不用再新写方法了， 就很多余。
        @Override
        public String toString() {
//            return super.toString();
            return "Manager{" +
                    "name='" + getName() + "\'" +
                    ", age=" + getAge() +
                    '}';
        }

        @Override
        public String getName() {
            // 如果想要获取到name属性， 那么就需要使用getName(), 但是在本方法中， 就用是自己， 会导致崩溃。
            // 在子类里面， 如果要获取到继承来的属性，可以使用super属性。 super代表父类。 this 代表当前。
            String baseName = super.getName();
            return "wang" + baseName;
//            return super.getName();
        }
    }


    public static void main(String[] args) {
        Manager m = new Manager("bob", 12);
//        m.setName("bob");
//        m.setAge(12);
        String res = m.toString();
        System.out.println(res);
        System.out.println(m.getName());

        Manager m1 = new Manager("cookie", 12);

        Employee[] stuff = new Employee[3];
        stuff[0] = m1;
        stuff[1] = new Employee("bob1", 12);
        stuff[2] = new Employee("bob2", 12);
        for (Employee e : stuff) {
            System.out.println(e.toString());
        }

        String res1 = stuff[0].getName();
        String res2 = stuff[0].getName();
        // 可以同时使用， stuff[x]和 m1 的格式来进行方法的调用。
        System.out.println(res1);
        System.out.println(res2);
    }

}
